<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>高阶函数实现函数柯里化</title>
</head>

<body>
    <script>
        //通过AOP,在function.prototype原型上,植入.
        Function.prototype.before = function (beforeFn) {
            // 给所有函数添加原型方法before
            // 传入执行beforeFn这个传入的函数,参数也要衔接过来
            let _self = this // 保存原函数的引用
            return function () {
                beforeFn.apply(this, arguments) //执行新函数,修正this
                return _self.apply(this, arguments) // 执行原函数
            }
        }
        Function.prototype.after = function (afterFn) {
            // 给所有函数添加原型方法before
            // 传入执行beforeFn这个传入的函数,参数也要衔接过来
            let _self = this // 保存原函数的引用
            return function () {
                _self.apply(this, arguments) //执行新函数,修正this
                return afterFn.apply(this, arguments) // 执行原函数
            }
        }

        var func = function () {
            console.log(2);
        }
        // 对func进行包装 func原型方法before 传入新函数,打印1 
        func = func.before(function () {
            console.log(1);
        }).after(function () {
            console.log(3);
        })
        func()
    </script>
</body>

</html>